<?php

/**
 * Редактирование названий групыы.
 *
 */
class Tests_Backend_Groups_Edit extends Kernel_Action_Form_Simple 
{
    
    /**
    * @desc Коллекция тестов.
    * 
    * @param array
    */
    static protected $_existed_collection = array();  
    
    /**
     * Таблица, в которой хранится редактируемый элемент.
     *
     * @var string
     */
    protected $_table = 'tests_groups';
    
    /**
     * Инициализирует элементы формы.
     *
     */
    protected function _initElements()
    {
        parent::_initElements();
        
        $this->_setElementParam('title', array('caption' => 'Название'));
        $this->_addElement('no-element', array(
            'type' => 'hidden', 
            'caption' => '<br />Список тестов', 
            'value' => true, 
            ));
        
        if (!$this->_isNew()) {
            $existed = $this->_addExistedTestCollection();
        }
        foreach(Tests_Utils::getTestsList() as $id => $test) {
            $this->_addElement('tests[' . $id . ']', array(
                'type' => 'checkbox', 
                'caption' => $test, 
                'nolabel' => true, 
                'value' => ($this->_isNew() ? 0 : in_array($id, $existed)), 
                ));
        }
        $this->_setAsRequired('title', 'no-element');
    }
    
    protected function _validate()
    {
        parent::_validate();
        $this->_validateTestCollection();
    }
    
    /**
    * @desc Проверяем выбран ли хоть один тест в группу
    * 
    */
    protected function _validateTestCollection() 
    {
        if (!isset($_POST['tests']) || !is_array($_POST['tests'])) {
                $this->_error(__('TEST_COLLECTION_NOT_SELECTED'));
            }
    }
    
    /**
     * Сохраняет данные формы.
     *
     */
    protected function _save() 
    {
        parent::_save();
        $this->_refreshTestCollection();
    }
        
    /**
    * @desc Обновляет коллекцию у редактируемой группы.
    * 
    */
    protected function _refreshTestCollection() 
    {
        $table = 'tests_groups_collection';
        // сущечствующие тесты (если тест редактируется, иначе пустой массив)
        $existed = $this->_isNew() ? array() : $this->_addExistedTestCollection();
        // пришедшие тесты
        $incoming = array_keys($_POST['tests']);
        
        // удаляем из БД разницу из существующих и пришедших
        if (count($delete_records = array_diff($existed, $incoming))) {
            database::delete($table, '`test` IN (' . implode(',',$delete_records) . ')');
        }
        
        // вставляем в БД разницу из пришедших и существующих
        if (count($insert_records = array_diff($incoming, $existed))) {
            $values = '';
            foreach($insert_records as $record) {
                $values .= '(' . $this->id . ', ' . $record . '), ';
            }
            $values = substr($values, 0, -2);
            $query = '
                INSERT
                       `tests_groups_collection`
                       (`title_id`, `test`)
                VALUES
                       ' . $values;
            database::query($query);
        }
    }
    
    /**
    * @desc Возвращает существующую коллекцию текущей группы.
    * 
    * @return array
    */
    protected function _addExistedTestCollection() 
    {
        // имитация кэша 
        if (count(self::$_existed_collection)) return self::$_existed_collection;
        
        $query = '
            SELECT 
                   `test` 
              FROM 
                   `tests_groups_collection` 
             WHERE 
                   `title_id` = ' . $this->id;
        return self::$_existed_collection = database::fetchCol($query);
    }
    
}